#include "../lib/ls1c_public.h"
#include "../lib/ls1c_irq.h"
#include "../lib/ls1c_gpio.h"
#include "../lib/ls1c_delay.h"
#include "../lib/ls1c_mipsregs.h"
#include "../lib/ls1c_uart.h"
#include "../lib/ls1c_sys_tick.h"
#include "../lib/ls1c_clock.h"
#include "oled_ssd1306_i2c.h"




// 硬浮点初始化
void fpu_init(void)
{
    unsigned int c0_status = 0;
    unsigned int c1_status = 0;

    // 使能协处理器1--FPU
    c0_status = read_c0_status();
    c0_status |= (ST0_CU1 | ST0_FR);
    write_c0_status(c0_status);

    // 配置FPU
    c1_status = read_c1_status();
    c1_status |= (FPU_CSR_FS | FPU_CSR_FO | FPU_CSR_FN);    // set FS, FO, FN
    c1_status &= ~(FPU_CSR_ALL_E);                          // disable exception
    c1_status = (c1_status & (~FPU_CSR_RM)) | FPU_CSR_RN;   // set RN
    write_c1_status(c1_status);

    return ;
}


void bsp_init(void)
{
    // 初始化调试串口
    uart2_init();
    
    // 硬浮点初始化
    fpu_init();

    // 初始化异常
    exception_init();

    // 显示时钟信息
    clk_print_all();

    return ;
}


int main(void)
{
    bsp_init();

    // 注意内存的大小，在文件sdram_cfg.h中配置内存大小，
    // 源文件中已经有8M和32M的代码，只需要 “#if 0” 或者 “#if 1” 来选择

    // 初始化oled
    oled_init();
    printf("[%s] oled init ok!\r\n", __FUNCTION__);

    while (1)
    {
        // 全屏点亮
        oled_fill(0xff);
        printf("[%s] oled all display on!\r\n", __FUNCTION__);
        delay_s(3);

        // 全屏灭
        oled_fill(0x00);
        printf("[%s] oled all display off!\r\n", __FUNCTION__);
        delay_s(3);

        // 显示英文和数字的字符串
        oled_show_en_num_str(0, 0, "ls1c test oled");
        oled_show_en_num_str(0, 2, "123 ABC abc...");
        printf("[%s] oled display 'ls1c BaiCaiBan test oled 123 ABC abc...'\r\n", __FUNCTION__);
        delay_s(5);

        // 显示中文字符串"作者：勤为本"
        oled_show_cn_test_str(0, 6);
        printf("[%s] oled display cn test string!\r\n");
        delay_s(5);

        // oled休眠
        oled_sleep();
        delay_s(3);

        // oled唤醒
        oled_normal_work();
        delay_s(3);

        // oled清屏
        oled_clear_screen();
        delay_s(3);
    }

	return(0);
}





